type
status
date
slug
summary
tags
category
icon
password
📝 网络基础
1、核心网络设备
1.1、交换机
- 角色:局域网(LAN)的交通警察
- 工作层级:主要工作在数据链路层(二层)。
- 功能:它的核心任务是在同一个网络内部(例如,同一个办公室或楼层)高效地连接多台设备(电脑、打印机、摄像头等)。它通过识别设备的MAC地址,将数据帧准确地转发给目标设备,而不是广播给所有设备。
- 简单比喻:像一个高效的办公室内部邮件分拣员。他知道每个工位(MAC地址)上的人是谁,收到信件(数据)后,能直接投递到正确的工位,不会打扰其他人。
1.2、路由器
- 角色:不同网络之间的网关和导航员
- 工作层级:工作在网络层(三层)。
- 功能:它的核心任务是连接不同的网络,并在它们之间转发数据包。它通过识别IP地址,决定数据包的最佳路径,将其从一个网络(如你家网络)发送到另一个网络(如互联网)。
- 主要能力:
- 分配IP地址(通过DHCP服务)。
- 网络地址转换(NAT):让你家中的所有设备共用同一个公共IP地址上网。
- 防火墙:提供基本的安全防护,过滤不必要的流量。
- 简单比喻:像一个邮局的 sorting center(分拣中心)。它查看信封上的邮政编码(IP地址),决定这封信是留在本市(局域网)还是发往另一个城市(另一个网络/互联网)。
1.3、三层交换机
- 角色:交换机和路由器的结合体
- 工作层级:同时具备数据链路层(二层)和网络层(三层)的功能。
- 功能:它本质上是一个带有路由功能的高速交换机。主要用于大型局域网内部需要高速路由的场景(例如,在不同部门或VLAN之间进行数据交换)。它能用硬件的速度完成路由功能,比“路由器+交换机”的方案更快。
- 简单比喻:像一个兼具内部邮件分拣员和跨部门邮件通道管理员的超级员工。他既能快速在部门内投递信件(交换),又能高速地处理不同部门之间的信件往来(路由),效率极高。
1.4、小结
设备 | 工作范围 | 核心标识 | 比喻 |
交换机 | 同一个网络内部 | MAC地址 | 办公室邮件分拣员 |
路由器 | 不同网络之间 | IP地址 | 邮局分拣中心 |
三层交换机 | 大型局域网内部的不同网段 | MAC & IP地址 | 超级管理员(交换+路由) |
2、常见网络架构

2.1、小型企业基础网络架构
典型的架构是 “三层结构”:
- 接入层:最底层,连接终端用户设备(电脑、IP电话等)。使用普通交换机。
- 汇聚层:中间层,连接接入层交换机。通常使用三层交换机,用于处理企业内部不同VLAN(虚拟局域网,如财务部、销售部)之间的路由、访问控制策略等。
- 核心层:网络骨干,连接汇聚层交换机、企业服务器、以及路由器。追求高速和高可靠性。
- 出口:企业边界的路由器/防火墙,连接互联网。
数据流向:电脑 -> 接入层交换机 -> 汇聚层(三层交换机)-> (如需访问外网)核心层 -> 出口路由器 -> 互联网。
2.2、家庭网络架构
结构非常简单,通常所有功能集成在一个设备上:
- 核心设备:无线路由器(集成了路由器、交换机、Wi-Fi接入点和防火墙功能)。
- 连接方式:
- 有线设备(如台式机、智能电视)通过网线连接到路由器后方的交换机端口上。
- 无线设备(手机、笔记本)通过Wi-Fi连接到路由器。
- 出口:路由器通过WAN口连接至光猫/调制解调器,最终接入互联网服务提供商(ISP)的网络。
2.3、互联网
- 本质:网络的网络。
- 构成:全球无数个自治网络(ISP、公司、学校、数据中心网络)通过路由器相互连接而成的巨大集合。
- 运作方式:没有中央控制。数据被分割成数据包,每个包都包含目标IP地址。路由器之间通过BGP等路由协议相互通信,共享路径信息,像传递接力棒一样,共同协作将数据包从源地址路由到目标地址。
3、网络核心词汇
3.1、IP地址与子网掩码
1. IP地址
- 是什么:设备的网络“门牌号”。就像每栋房子有一个唯一的地址用来收寄信件一样,网络上的每台设备(电脑、手机、服务器等)都需要一个唯一的IP地址来收发数据。
- 格式:通常表现为四组用点分开的数字(如
192.168.1.10
),这称为IPv4。
- 作用:用于标识和定位网络上的设备,是数据传输的“目的地”和“发件人”。
2. 子网掩码
- 是什么:定义IP地址的“社区范围”。它用来区分一个IP地址中哪部分是网络号(代表整个社区),哪部分是主机号(社区里的具体门牌)。
- 格式:看起来和IP地址类似(如
255.255.255.0
)。
- 作用:判断两台设备是否在同一个本地网络(子网) 内。
- 例子:设备A (
192.168.1.10
) 和设备B (192.168.1.20
) 的子网掩码都是255.255.255.0
。 - 通过计算可知,它们属于同一个网络(
192.168.1.0
)。它们之间的通信直接通过交换机完成,速度快。 - 设备C (
192.168.2.30
) 和它们子网掩码相同,但网络号是192.168.2.0
,属于不同网络。它们通信需要经过路由器转发。
简单比喻:
- IP地址:
中国-北京市-海淀区-XX路-100号
- 子网掩码:
255.255.255.0
就像说“前三个部分(中国-北京市-海淀区)是网络区域,最后一部分(100号)是具体主机”。
- 同子网设备通信,就像在同一栋楼里喊话;不同子网设备通信,就像需要邮局在不同城市间寄信。
3.2、DHCP
- 是什么:动态主机配置协议。它是一个自动化的网络管理员。
- 作用:自动为网络中的设备分配IP地址、子网掩码、网关地址(路由器地址)和DNS服务器地址。
- 好处:你不需要手动为每台电脑、手机设置IP地址,插上网线或连上Wi-Fi就能上网,非常方便。家庭路由器就内置了DHCP功能。
简单比喻:像一个公司的前台,新员工(新设备)入职(接入网络)时,前台自动给他分配一个工位号(IP地址)并告诉他经理(网关)在哪。
3.3、内网(私有)IP 与 公网IP
- 内网(私有)IP地址:
- 范围:专门预留的一些地址段(如
192.168.x.x
,10.x.x.x
,172.16.x.x - 172.31.x.x
)。 - 作用:在家庭、公司等内部网络使用。它们不能直接在互联网上被访问。
- 特点:可以重复使用。你家路由器分配的是
192.168.1.x
,我家路由器也可以分配同样的地址,互不冲突。
- 公网IP地址:
- 范围:除内网IP外的所有地址。
- 作用:在全球互联网上唯一标识一个设备。是你在互联网上的“身份证”。
- 特点:全球唯一,需要向运营商购买/租用。
它们如何协同工作:
你家所有设备都使用内网IP(如
192.168.1.100
)。当你访问百度时,数据包到达路由器,路由器会进行NAT(网络地址转换),把你的内网IP换成路由器的公网IP再发出去。返回的数据包也是先到路由器,再由路由器转发给你的设备。简单比喻:
- 公网IP:你公司的总机号码(只有一个,对外公开)。
- 内网IP:公司内部各个分机号(如
101
,102
,可以和其他公司的分机号重复)。
- 外线电话打进来,总机(路由器)需要转接到正确的分机(你的电脑)。
3.4、云服务器
- 是什么:一台放在远数据中心、可以通过互联网远程访问的虚拟电脑。
- 与传统服务器的区别:你不需要自己购买和维护物理硬件。服务商(如阿里云、AWS)提供网页界面,让你可以按需、灵活地租用计算能力、存储空间和网络资源,用时付费,不用就关掉。
- 用途:搭建网站、运行应用程序、存储数据、数据分析等。
简单比喻:从“自己发电”变成了“从国家电网用电”。你不用自己买发电机、维护发电机,只需按用电量付费,随时可用,弹性伸缩。
3.5、端口
- 是什么:一台设备上的“应用程序门牌号”。IP地址帮你找到了正确的“大楼”(设备),端口则帮你找到大楼里正确的“房间”(应用程序/服务)。
- 格式:一个16位的数字(0-65535)。
- 作用:让一台设备可以同时运行多个网络应用(如一边浏览网页一边收邮件),而数据不会送错地方。
- 常见端口:
80
: HTTP (网页服务)443
: HTTPS (加密的网页服务)25
: SMTP (邮件发送)21
: FTP (文件传输)
简单比喻:IP地址是公司的地址,端口是公司的部门分机号(如销售部请按101,技术支持请按102)。
3.6、域名
- 是什么:IP地址的“好记别名”。因为人类很难记住一串数字(如
142.251.42.206
),但很容易记住名字(如google.com
)。
- 作用:方便人们访问网站和服务。
- 如何工作:当你浏览器输入
google.com
时,它会先去问 DNS服务器(像一本巨大的电话簿),DNS服务器会查询到这个名字对应的真实IP地址(142.251.42.206
),然后浏览器才能通过IP地址找到谷歌的服务器。
简单比喻:域名是手机通讯录里的联系人姓名,IP地址是Ta的电话号码。你想打电话给“张三”,不需要背出他的号码,只需在通讯录里找名字,手机自动帮你拨号。
📝 OSI 7层模型

1、什么是OSI七层模型?
OSI(开放系统互联)模型是一个由国际标准化组织(ISO)提出的概念性框架,用于描述网络通信过程中,不同计算机系统之间如何相互连接和通信。它将复杂的网络通信过程分解为七个更小、更易于管理的层。
核心思想:每一层都为其上一层提供服务,并调用下一层的服务。同时,每一层都遵循特定的协议和标准,层与层之间通过清晰的接口进行交互。这种分层结构使得网络设计、故障排除和协议开发都变得更加模块化和简化。
2、七层结构详解(从下到上)
OSI层数 | 名称 | 功能简介 | 协议数据单元(PDU) | 常见协议/设备 |
第7层 | 应用层 | 为用户应用程序提供网络服务接口 | Message(消息) | HTTP, HTTPS, FTP, SMTP, DNS, Telnet |
第6层 | 表示层 | 数据翻译、加密解密、压缩解压缩 | ㅤ | SSL/TLS, JPEG, MPEG, GIF |
第5层 | 会话层 | 建立、管理、终止应用程序之间的会话 | ㅤ | NetBIOS, RPC, SIP |
第4层 | 传输层 | 提供端到端的可靠或不可靠数据传输 | Segment(段)或 Datagram(数据报) | TCP, UDP |
第3层 | 网络层 | 提供逻辑地址(IP)、路由和寻址 | Packet(包) | IP, ICMP, IPSec, 路由器 |
第2层 | 数据链路层 | 提供介质访问、物理寻址(MAC)、差错校验 | Frame(帧) | Ethernet, PPP, Switch, 网桥 |
第1层 | 物理层 | 传输原始比特流,定义电气、机械特性 | Bit(比特) | ㅤ |
3、各层详细功能说明
3.1、物理层
- 功能:在物理介质上透明地传输比特流(0和1)。它定义了设备的物理特性,如电压水平、线缆规格、接口类型(如RJ45)、传输速率、最大距离等。
- 比喻:就像公路本身,负责让车辆(比特流)能够行驶。它不关心车上装的是什么货,只关心路能不能走。
- 设备:集线器(Hub)、中继器(Repeater)、调制解调器(Modem)、网线、光纤。
3.2、数据链路层
- 功能:
- 成帧:将来自网络层的包封装成帧,添加头部和尾部。
- 物理寻址:在帧的头部添加MAC地址(源MAC和目的MAC)。
- 差错控制:通过帧尾部的校验码(如CRC)检测传输过程中是否出现比特错误。
- 流量控制:控制发送速率,确保接收方不会被淹没。
- 介质访问控制:决定设备何时可以在共享介质(如以太网)上发送数据。
- 比喻:就像交通规则和汽车牌照。它确保在一条公路上(同一局域网内),车辆能正确地找到对方,并且不发生碰撞。
- 设备:交换机(Switch)、网桥(Bridge)。注意:交换机基于MAC地址转发数据,工作在第二层。
3.3、网络层
- 功能:
- 逻辑寻址:为设备分配IP地址,并封装到包的头部。IP地址是全局的、可路由的。
- 路由:根据目的IP地址,为数据包选择最佳路径,穿越不同的网络(从源网络到目标网络)。
- 拥塞控制:管理网络中的数据流量,避免网络过载。
- 比喻:就像GPS导航和邮政系统中的邮政编码。它不关心本地地址(MAC地址),只关心如何将包裹从一个城市(网络)投递到另一个城市。
- 设备:路由器(Router)。路由器是连接不同网络的关键设备,基于IP地址进行转发。
3.4、传输层
- 功能:
- 端到端通信:提供应用程序进程之间的逻辑通信(通过端口号标识不同应用,如80端口对应Web服务)。
- 服务类型:提供两种主要协议:
- TCP:面向连接的、可靠的传输。提供确认、重传、流量控制和拥塞控制。
- UDP:无连接的、不可靠但高效的传输。
- 分段与重组:将上层数据分割成更小的段,并在接收端重新组装。
- 差错控制:确保数据完整、有序地到达。
- 比喻:就像公司的收发室。它负责将公司(主机)内部不同部门(应用程序)的信件打包,并选择可靠的快递(TCP)或普通的平邮(UDP)寄出。
3.5、会话层
- 功能:建立、管理和终止两个应用进程之间的会话(Session)。会话是持续较长时间的连接。
- 例如:在传输一个大文件时,网络连接暂时中断,会话层可以在连接恢复后从中断点继续,而不必重新开始。
- 比喻:就像电话接线员,负责拨号建立通话(会话),并在通话结束后挂断。
3.6、表示层
- 功能:充当应用程序和网络之间的“翻译官”,确保一个系统应用层发出的信息能被另一个系统的应用层读懂。
- 数据转换:将数据从适合应用的格式转换为适合网络传输的格式,如编码转换(ASCII to Unicode)。
- 加密/解密:如SSL/TLS协议就在这一层开始工作。
- 压缩/解压缩:减少传输的数据量。
- 比喻:就像同声传译,将一种语言(数据格式)翻译成另一种对方能理解的语言。
3.7、应用层
- 功能:最靠近用户的一层,为应用程序提供网络服务接口。它并不是指应用程序本身(如Chrome浏览器),而是指应用程序用来实现网络功能的协议。
- 例如:使用浏览器时,它调用的是HTTP/HTTPS协议;发送邮件时,调用的是SMTP协议。
- 比喻:就像你(用户)。你想做什么(浏览网页、发邮件),就直接使用相应的工具(协议)。
4、数据封装与解封装过程
4.1、发送端(封装过程 - 从上到下):
- 用户在应用程序中输入数据(Data)。
- 应用层:加上应用层头 → Message。
- 表示层:加上表示层头,进行加密/压缩等。
- 会话层:加上会话层头。
- 传输层:加上TCP/UDP头(含端口号) → Segment。
- 网络层:加上IP头(含IP地址) → Packet。
- 数据链路层:加上帧头(含MAC地址)和帧尾(CRC) → Frame。
- 物理层:将帧转换为比特流,通过物理介质发送出去。
4.2、接收端(解封装过程 - 从下到上):
- 物理层:接收比特流。
- 数据链路层:检查MAC地址和帧错误,去掉帧头和帧尾,将Packet上交。
- 网络层:检查IP地址,决定是否路由,去掉IP头,将Segment上交。
- 传输层:根据端口号将数据交给正确的应用程序,处理序列号和确认,去掉TCP/UDP头。
- 会话层、表示层:管理会话,进行解密/解压等,逐层去掉头部。
- 应用层:将原始的Data呈现给应用程序。
5、OSI模型 vs. TCP/IP模型
需要注意的是,OSI模型是一个理论模型,而现实中广泛使用的是更简化的TCP/IP模型(4层或5层)。它们的对应关系如下:
OSI七层模型 | TCP/IP五层模型 | TCP/IP四层模型 |
应用层、表示层、会话层 | 应用层 | 应用层 |
传输层 | 传输层 | 传输层 |
网络层 | 网络层 | 网际层 |
数据链路层、物理层 | 网络接口层 | 网络接口层 |
📝 UDP和TCP协议
1、UDP 和 TCP 概述
1.1、UDP(用户数据报协议)
UDP是一种简单的、无连接的传输层协议。
- 无连接:通信前不需要先建立连接,直接发送数据。这就像寄明信片,无需确认收件人地址是否正确、是否在家,直接投递即可。
- 不可靠:不提供数据包的确认、重传、排序机制。如果数据包在中途丢失、重复或乱序,UDP不会进行处理。
- 高效:因为不需要建立连接和维护复杂的控制机制,头部开销小(仅8字节),传输延迟低,速度快。
- 支持多播和广播:可以将数据包一次性发送给多个主机。
UDP报文头结构(8字节):

字段 | 长度 | 描述 |
Source Port | 2字节 | 标识哪个应用程序发送(发送进程)。 |
Destination Port | 2字节 | 标识哪个应用程序接收(接收进程)。 |
Length | 2字节 | UDP首部加上UDP数据的字节数,最小为8。 |
Checksum | 2字节 | 覆盖UDP首部和UDP数据,是可选的。 |
data octets | 变长 | UDP负载,可选的。 |
- 应用场景:适用于对传输延迟和速率敏感,但能容忍少量数据丢失的应用。
- 音视频流媒体(直播、视频会议)
- 在线游戏(实时状态同步)
- DNS查询
- TFTP(简单文件传输协议)
- DHCP
核心总结:UDP 追求一个“快”字,简单粗暴,但不管“售后”。
1.2、TCP(传输控制协议)
TCP是一种复杂的、面向连接的、可靠的传输层协议。
- 面向连接:在数据传输之前,必须通过三次握手建立稳定的连接。传输结束后,通过四次挥手断开连接。这就像打电话,需要先拨号接通,通话结束后要礼貌道别并挂断。
- 可靠传输:通过以下机制确保数据准确无误地送达:
- 确认和重传(ACK & Retransmission):接收方收到数据后会发送确认报文。发送方在一定时间内未收到确认,则会重传数据。
- 序列号和确认号:每个字节的数据都被编号(序列号),确认号告知对方期望收到的下一个字节的编号。这解决了乱序和重复问题。
- 流量控制:通过滑动窗口机制,根据接收方的处理能力来调整发送速率,防止接收方缓冲区溢出。
- 拥塞控制:通过复杂的算法(如慢启动、拥塞避免、快重传、快恢复)感知网络拥堵情况,动态调整发送速率,避免网络瘫痪。
TCP报文头结构(至少20字节):

字段 | 长度 | 含义 |
Source Port | 16比特 | 源端口,标识哪个应用程序发送。 |
Destination Port | 16比特 | 目的端口,标识哪个应用程序接收。 |
Sequence Number | 32比特 | 序号字段。TCP链接中传输的数据流中每个字节都编上一个序号。序号字段的值指的是本报文段所发送的数据的第一个字节的序号。 |
Acknowledgment Number | 32比特 | 确认号,是期望收到对方的下一个报文段的数据的第1个字节的序号,即上次已成功接收到的数据字节序号加1。只有ACK标识为1,此字段有效。 |
Data Offset | 4比特 | 数据偏移,即首部长度,指出TCP报文段的数据起始处距离TCP报文段的起始处有多远,以32比特(4字节)为计算单位。最多有60字节的首部,若无选项字段,正常为20字节。 |
Reserved | 6比特 | 保留,必须填0。 |
CWR | 1比特 | 拥塞窗口减少标识 |
ECE | 1比特 | ECN回声标识 |
URG | 1比特 | 紧急指针有效标识。它告诉系统此报文段中有紧急数据,应尽快传送(相当于高优先级的数据)。 |
ACK | 1比特 | 确认序号有效标识。只有当ACK=1时确认号字段才有效。当ACK=0时,确认号无效。 |
PSH | 1比特 | 标识接收方应该尽快将这个报文段交给应用层。接收到PSH = 1的TCP报文段,应尽快的交付接收应用进程,而不再等待整个缓存都填满了后再向上交付。 |
RST | 1比特 | 重建连接标识。当RST=1时,表明TCP连接中出现严重错误(如由于主机崩溃或其他原因),必须释放连接,然后再重新建立连接。 |
SYN | 1比特 | 同步序号标识,用来发起一个连接。SYN=1表示这是一个连接请求或连接接受请求。 |
FIN | 1比特 | 发端完成发送任务标识。用来释放一个连接。FIN=1表明此报文段的发送端的数据已经发送完毕,并要求释放连接。 |
Window | 16比特 | 窗口:TCP的流量控制,窗口起始于确认序号字段指明的值,这个值是接收端期望接收的字节数。窗口最大为65535字节。 |
Checksum | 16比特 | 校验字段,包括TCP首部和TCP数据,是一个强制性的字段,一定是由发端计算和存储,并由收端进行验证。在计算检验和时,要在TCP报文段的前面加上12字节的伪首部。 |
Urgent Pointer | 16比特 | 紧急指针,只有当URG标志置1时紧急指针才有效。TCP的紧急方式是发送端向另一端发送紧急数据的一种方式。紧急指针指出在本报文段中紧急数据共有多少个字节(紧急数据放在本报文段数据的最前面)。 |
Options | 可变 | 选项字段。TCP协议最初只规定了一种选项,即最长报文段长度(只包含数据字段,不包括TCP首部),又称为MSS。MSS告诉对方TCP“我的缓存所能接收的报文段的数据字段的最大长度是MSS个字节”。
新的RFC规定有以下几种选型:选项表结束,空操作,最大报文段长度,窗口扩大因子,时间戳。
• 选项表结束。
• 空操作:没有特殊含义,一般用于将TCP选项的总长度填充为4字节的整数倍。
• 最大报文段长度:又称为MSS,只包含数据字段,不包括TCP首部。
• 窗口扩大因子:3字节,其中一个字节表示偏移值S。新的窗口值等于TCP首部中的窗口位数增大到(16+S),相当于把窗口值向左移动S位后获得实际的窗口大小。
• 时间戳:10字节,其中最主要的字段是时间戳值(4字节)和时间戳回送应答字段(4字节)。 |
data | 可变 | TCP负载。 |
- 应用场景:适用于要求数据完整、准确无误传输的应用。
- Web浏览(HTTP/HTTPS)
- 电子邮件(SMTP, POP3, IMAP)
- 文件传输(FTP)
- 远程登录(SSH)
核心总结:TCP 追求一个“稳”字,机制复杂,保证数据可靠交付。
2、TCP 的三次握手(连接建立)

目的:双方确认彼此的发送和接收能力正常,并同步初始序列号(ISN)。
假设客户端(Client)想要主动与服务器(Server)建立连接。
- 第一次握手(SYN):
- 客户端发送一个TCP报文。
- 设置标志位 SYN=1,表示请求建立连接。
- 选择一个初始序列号(ISN),例如
seq = x
。 - 进入
SYN-SENT
状态。

- 第二次握手(SYN + ACK):
- 服务器收到客户端的SYN报文。
- 如果同意连接,则回复一个TCP报文。
- 设置标志位 SYN=1 和 ACK=1。
- 确认号字段设置为
ack = x + 1
(表示期望收到下一个数据包的序列号是x+1)。 - 同时为自己选择一个初始序列号,例如
seq = y
。 - 进入
SYN-RCVD
状态。

- 第三次握手(ACK):
- 客户端收到服务器的SYN-ACK报文。
- 向服务器发送一个确认报文。
- 设置标志位 ACK=1。
- 序列号
seq = x + 1
(因为第一次握手消耗了一个序列号)。 - 确认号
ack = y + 1
。 - 客户端进入
ESTABLISHED
(连接已建立)状态。 - 服务器收到这个ACK后,也进入
ESTABLISHED
状态。

至此,连接建立成功,双方可以开始传输数据。
为什么是三次,而不是两次?
主要目的是防止“已失效的连接请求报文”突然又传送到服务器,导致错误。假设一种情况:客户端发送了一个SYN请求,但这个包在网络中滞留了(失效了)。客户端超时未收到回应,于是重发一个SYN并成功建立连接。结束后,那个滞留的SYN包终于到达了服务器。如果只有两次握手,服务器会认为这是一个新的连接请求,会直接回复SYN-ACK并进入连接状态,浪费服务器资源。而有了第三次握手,客户端不会理会这个陈旧的SYN-ACK,因此不会发送确认,服务器由于收不到确认,就不会建立连接。
3、TCP 的四次挥手(连接释放)

目的:双方都确认数据已发送完毕,可以安全地断开连接。TCP连接是全双工的,因此每个方向必须单独关闭。
假设客户端主动发起关闭。
- 第一次挥手(FIN):
- 客户端的数据发送完毕后,应用层通知TCP要关闭连接。
- 客户端发送一个TCP报文。
- 设置标志位 FIN=1,并指定一个序列号,例如
seq = u
。 - 客户端进入
FIN-WAIT-1
状态。
- 第二次挥手(ACK):
- 服务器收到FIN报文后,立即回复一个确认报文。
- 设置标志位 ACK=1。
- 确认号
ack = u + 1
。 - 序列号为
seq = v
(为自己之前发送的序列号)。 - 服务器进入
CLOSE-WAIT
状态。此时,从客户端到服务器的连接就关闭了(即客户端不再发送数据,但服务器可能还有数据要发送)。 - 客户端收到这个ACK后,进入
FIN-WAIT-2
状态。
- 第三次挥手(FIN):
- 服务器将最后剩余的数据发送完毕后,也准备关闭连接。
- 服务器发送一个TCP报文。
- 设置标志位 FIN=1 和 ACK=1(通常还会顺带对之前的报文做一次确认)。
- 指定一个序列号
seq = w
(可能已经增长),确认号依然是ack = u + 1
。 - 服务器进入
LAST-ACK
(最后确认)状态。
- 第四次挥手(ACK):
- 客户端收到服务器的FIN报文后,必须发出确认。
- 发送一个确认报文,设置 ACK=1。
- 序列号
seq = u + 1
(因为第一次挥手消耗了一个序列号)。 - 确认号
ack = w + 1
。 - 客户端进入
TIME-WAIT
状态。等待2MSL(最大报文段生存时间)后,客户端才进入CLOSED
状态。 - 服务器只要收到这个ACK,就立即进入
CLOSED
状态。
为什么客户端最后需要等待2MSL?
保证最后一个ACK能到达服务器:如果服务器没有收到第四次挥手的ACK,它会重传第三次挥手的FIN报文。客户端在2MSL时间内收到这个重传的FIN,会重传ACK并重新计时2MSL。让本次连接产生的所有报文都在网络中消失:等待2MSL时间,足以使本次连接期间产生的所有报文都从网络中消亡,这样不会影响下一次新的连接。
为什么是四次挥手?
因为TCP连接是全双工的,关闭每个方向都需要一个FIN和一个ACK。当客户端发送FIN时,只表示它没有数据要发了,但还可以接收数据。服务器收到FIN后,可能还有数据要发送给客户端,所以它的ACK和FIN不能合并为一次发送,这就比三次握手多了一次。